package com.sky.controller.admin;

import com.sky.dto.DishDTO;
import com.sky.dto.DishPageQueryDTO;
import com.sky.result.PageResult;
import com.sky.result.Result;
import com.sky.service.DishService;
import com.sky.vo.DishVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Set;

@RestController
@Slf4j
@RequestMapping("/admin/dish")
public class DishController {
  @Autowired
  private DishService dishService;
  @Autowired
  private RedisTemplate redisTemplate;
  
  /**
   * 清理所有以dish_开头的缓存数据。
   * 该方法用于在更新或删除菜品信息后，确保缓存中的数据与数据库保持一致。
   * 它通过RedisTemplate获取所有符合模式dish_*的键，并将其从Redis缓存中删除。
   */
  private void extracted() {
    // 将所有的菜品缓存数据清理， 所有以dish_开头的key
    Set keys = redisTemplate.keys("dish_*");
    redisTemplate.delete(keys);
  }
  
  /**
   * 分页查询
   */
  @GetMapping("/page")
  public Result<PageResult> page(@ModelAttribute DishPageQueryDTO queryDTO) {
    log.info("菜品分页查询：{}", queryDTO);
    PageResult page = dishService.page(queryDTO);
    return Result.success(page);
  }
  
  /**
   * 新增菜品
   * @param dishDTO
   */
  @PostMapping
  public Result add(@RequestBody DishDTO dishDTO) {
    log.info("新增菜品：{}", dishDTO);
    
    // 清理缓存数据
    String key = "key_" + dishDTO.getCategoryId();
    redisTemplate.delete(key);
    
    dishService.add(dishDTO);
    return Result.success();
  }
  
  /**
   * 修改菜品
   * @param dishDTO
   */
  @PutMapping
  public Result update(@RequestBody DishDTO dishDTO) {
    dishService.update(dishDTO);
    extracted(); // 清理所有缓存数据
    return Result.success();
  }
  
  /**
   * 批量删除
   * @param ids
   */
  @DeleteMapping
  public Result batchDel(@RequestParam List<Long> ids){
    log.info("批量删除菜品： {}", ids);
    dishService.batchDel(ids);
    extracted(); // 清理所有缓存数据
    return Result.success();
  }
  
  /**
   * 根据id查找菜品
   * @param id
   */
  @GetMapping("/{id}")
  public Result<DishVO> findById(@PathVariable Long id) {
    DishVO dish = dishService.findById(id);
    return Result.success(dish);
  }
  
  /**
   * 根据类型查找
   */
  @GetMapping("/list")
  public Result findByType(Long categoryId) {
    List<DishVO> dishList = dishService.findByType(categoryId);
    return Result.success(dishList);
  }
  
  /**
   * 菜品起售、停售
   * @return
   */
  @PostMapping("status/{status}")
  public Result changeStatus(@PathVariable Integer status, @RequestParam Long id) {
    dishService.changStatus(status, id);
    extracted(); // 清理所有缓存数据
    return Result.success();
  }
}
